import http from "http";

import express from "express";
import { Server } from "socket.io";


const PORT = process.env.PORT || 8080;

const app = express();
const server = http.createServer(app);

//  设定使用的静态资源路径
// app.use('/', express.static('build'))
// // 执行app的get请求处理,处理访问ahout目录下的请求
// app.get('/', function (req, res) {
//     res.sendFile(__dirname + "index.html");
// })


// 创建信令服务器
const io = new Server({
    cors: {
        origin: '*', // 允许跨域
        methods: ['GET', 'POST'], // 允许的请求方式
        allowedHeaders: '*', // 允许的请求头
        credentials: true, // 允许携带cookie
    },
    allowEIO3: true, // 是否启用与Socket.IO v2客户端的兼容性
    transport: ['websocket'], // 仅允许websocket,["polling", "websocket"]
})
// import { handler } from "./build/handler.js";
// app.use(handler);
// 创建web服务，设定端口号和ip地址

server.listen(PORT, () => {
    console.log(`🚀🚀🚀 Running on port ${PORT}`);
});

// 监听用户连接
io.on("connection", (socket) => {
    socket.on("join-room", async (roomID) => {
        socket.join(roomID);
        const users = await io.in(roomID).allSockets();
        socket.to(roomID).emit("user-joined", socket.id);
        socket.emit("users", [...users]);
    });
    console.log(socket.id); //


    // 服务端，当用户加入房间
    socket.on('join', (data) => {
        handleUserJoin(socket, data)
    })

    // 房间信息
    const ROOM_LIST = []
    // 每个房间最多容纳的人数
    const MAX_USER_COUNT = 2
    // 用户加入房间
    function handleUserJoin (socket, data) {
        const filterRoom = ROOM_LIST.filter((item) => item.roomId === data.roomId)[0]
        let room = { roomId: data.roomId, userList: [] }

        // 判断房间是否存在
        if (filterRoom) {
            room = filterRoom
        } else {
            ROOM_LIST.push(room)
        }

        // 每个房间人数不超过预设的人数
        if (room.userList.length >= MAX_USER_COUNT) {
            socket.emit('error', '房间人数已满，请稍后再试')
            return
        }

        // 当房间里的人数为0且管理员还没有设置，设置管理员
        if (room.userList.length === 0) {
            room.admin = data.userId
        }

        // 判断用户是否已经在房间里
        if (room.userList.some((item) => item.userId === data.userId)) {
            socket.emit('error', '用户已在房间里')
            return
        }
        // 把用户信息保存到房间里
        room.userList.push(data)
        console.log(data.userId, '加入房间')

        socket.userId = data.userId
        socket.roomId = data.roomId

        // 将用户加入房间
        socket.join(data.roomId)
        // 通知房间内的其他用户
        socket.to(data.roomId).emit('welcome', data)
        // 通知自己加入房间成功，
        socket.emit('joined', data)

    }




    // 连接成功时触发
    socket.on('connect', () => {
        handleConnect()
    })

    // 断开连接时触发
    socket.on('disconnect', (reason) => {
        if (reason === 'io server disconnect') {
            // 断线是由服务器发起的，重新连接。
            socket.connect()
        }
        ElMessage.warning('您已断开连接')
    })
    // 服务端发送报错信息
    socket.on('error', (data) => {
        ElMessage.error(data)
    })
    // 当有用户加入房间时触发
    socket.on('welcome', (data) => {
        ElMessage.success(data.userId === userId ? '🦄成功加入房间' : `🦄${data.userId}加入房间`)
    })
    // 当有用户离开房间时触发
    socket.on('leave', (data) => {
        ElMessage.warning(data.userId === userId ? '🦄成功离开房间' : `🦄${data.userId}离开房间`)
    })
    // 当有用户发送消息时触发
    socket.on('message', (data) => { })
    // 创建offer,发送给远端
    socket.on('createOffer', (data) => {
        // 如果已经创建过，直接发送
        if (offerSdp) {
            socket.emit('offer', {
                userId,
                roomId: roomId.value,
                sdp: offerSdp,
            })
            return
        }
        createOffer() // 创建 offer
    })
    // 收到offer,创建answer
    socket.on('offer', (data) => {
        createAnswer(data.sdp)
    })
    // 收到answer,设置远端sdp
    socket.on('answer', (data) => {
        addAnswer(data.sdp)
    })


});

